/*
 *
 */
package org.jiscinvolve.astrodabis.barberry.common.data;

import org.jiscinvolve.astrodabis.barberry.common.core.Tag;
import org.jiscinvolve.astrodabis.barberry.common.core.Job;
import org.jiscinvolve.astrodabis.barberry.common.core.Owned;
import org.jiscinvolve.astrodabis.barberry.common.core.Tagged;
import org.jiscinvolve.astrodabis.barberry.common.core.Account;
import org.jiscinvolve.astrodabis.barberry.common.core.Tracked;
import org.jiscinvolve.astrodabis.barberry.common.core.Identified;
import org.jiscinvolve.astrodabis.barberry.common.core.Identifier;

/**
 *
 */
public interface JoinTag
extends Identified, Tracked, Tagged
    {

    public interface Factory
        {

        public Identifier ident(String ident);

        public JoinTag create(TapJoin join, Job job, Tag tag);
        public JoinTag createQuick(TapJoin join, Job job, Tag tag);

        public JoinTag create(TapJoin join, Job job, Tag tag, Double value);
        public JoinTag createQuick(TapJoin join, Job job, Tag tag, Double value);

        public JoinTag select(Identifier ident);

        public Iterable<JoinTag> select();

        public Iterable<JoinTag> select(Tag tag);

        public Iterable<JoinTag> select(Job job);
        public Iterable<JoinTag> select(Job job, int limit);

        public Iterable<JoinTag> select(TapJoin join);

        public Iterable<JoinTag> select(TapJoin join, Tag tag);

        public void delete(Tag tag);
        public void delete(Job job);

        }

    public TapJoin join();

    }


